/*-------------------------------------------------------------------------
 * slot_xlog.h
 *	   复制插槽管理。
 *
 * Copyright (c) 2012-2015, PostgreSQL Global Development Group
 *
 * src/include/replication/slot_xlog.h
 *-------------------------------------------------------------------------
 */
#ifndef SLOT_XLOG_H
#define SLOT_XLOG_H

#include "fmgr.h"
#include "access/xlog.h"
#include "access/xlogdefs.h"
#include "access/xlogreader.h"


/*
 * 复制槽的行为，在释放或崩溃时。
 *
 * 被标记为 PERSISTENT 的槽是崩溃安全的，
 * 并且在释放时不会被删除。被标记为 EPHEMERAL 的槽
 * 在释放时或重新启动后会被删除。被标记为 TEMPORARY 的槽
 * 会在会话结束时或发生错误时被删除。
 *
 * EPHEMERAL 用于创建持久性
 * 槽时的未准备状态。通过调用
 * ReplicationSlotPersist() 可以将 EPHEMERAL 槽
 * 变为 PERSISTENT。对于在会话结束时消失的槽，
 * TEMPORARY 是合适的选择。
 */
typedef enum ReplicationSlotPersistency
{
	RS_PERSISTENT,
	RS_EPHEMERAL,
	RS_TEMPORARY
} ReplicationSlotPersistency;

/*
 * 跨重启保留的复制槽的磁盘数据。
 */
typedef struct ReplicationSlotPersistentData
{
	/* 槽的标识符 */
	NameData	name;

	/* 数据库当前激活的插槽 */
	Oid			database;

	/*
	 * 插槽被丢弃（或在崩溃后恢复）时的行为。
	 */
	ReplicationSlotPersistency persistency;

	/*
	 * 数据的xmin范围
	 *
	 * 注意：这可能代表一个尚未写入磁盘的值；
	 * 请参见下面的effective_xmin注释。
	 */
	TransactionId xmin;

	/*
	 * 目录元组的xmin范围
	 *
	 * 注意：这可能代表一个尚未写入磁盘的值；
	 * 请参见下面的effective_xmin注释。
	 */
	TransactionId catalog_xmin;

	/* 可能被此复制插槽要求的最早的LSN */
	XLogRecPtr	restart_lsn;

	/* 当插槽失效时，这里会复制restart_lsn */
	XLogRecPtr	invalidated_at;

	/*
	 * 客户端已确认接收的最早LSN。这被用作
	 * start_lsn 点，以防客户端未指定一个，同时也作为
	 * 安全措施，以防客户端指定的
	 * start_lsn早于这个值。
	 */
	XLogRecPtr	confirmed_flush;

	/*
	 * 我们为此插槽启用了两阶段提交时的LSN或
	 * 在插槽创建时找到一致性点的LSN。
	 */
	XLogRecPtr	two_phase_at;

	/*
	 * 允许解码已准备的事务吗？
	 */
	bool		two_phase;

	//is failover slot?
	bool		failover;

	/* 插件名称 */
	NameData	plugin;
} ReplicationSlotPersistentData;

/*
 * 故障转移插槽的WAL记录
 */
#define XLOG_REPLSLOT_UPDATE	0x10
#define XLOG_REPLSLOT_DROP		0x20

typedef struct xl_replslot_drop
{
	NameData	name;
} xl_replslot_drop;

/* WAL 日志记录 */
extern void replslot_redo(XLogReaderState *record);
extern void replslot_desc(StringInfo buf, XLogReaderState *record);
extern const char *replslot_identify(uint8 info);

#endif   /* SLOT_XLOG_H */
